package leetcode101.tree;

/**
 * @author Synhard
 * @version 1.0
 * @class Code16
 * @description 404. 左叶子之和
 * 计算给定二叉树的所有左叶子之和。
 *
 * 示例：
 *
 *     3
 *    / \
 *   9  20
 *     /  \
 *    15   7
 *
 * 在这个二叉树中，有两个左叶子，分别是 9 和 15，所以返回 24
 *
 * @tel 13001321080
 * @email 823436512@qq.com
 * @date 2021-06-26 8:53
 */
public class Code16 {

    public static void main(String[] args) {

    }

    public int sumOfLeftLeaves(TreeNode root) {
        return dfs(root, false);
    }

    /**
     * @description 返回当前根节点的左节点之和
     * @param root 代表当前根节点
	 * @param flag 代表当前根节点是否是左节点
     * @return int
     * @author Synhard
     * @date 2021-06-26 9:10
     */
    private int dfs(TreeNode root, boolean flag) {
        if (root == null) {
            return 0;
        }
        // 如果当前结点左右结点都不为空就返回左右结点为根的两棵子树的左节点之和
        if (root.left != null && root.right != null) {
            return dfs(root.left, true) + dfs(root.right, false);
        }
        // 如果当前结点是叶子节点的话，当其是左子节点是返回自己的值，不是的话返回0
        if (root.left == null && root.right == null) {
            return flag ? root.val : 0;
        }
        // 如果当前结点的左节点是空的话返回右节点的左子节点之和
        if (root.left == null) {
            return dfs(root.right, false);
        }
        // 如果当前结点的右节点是空的话返回左节点的左子节点之和
        else {
            return dfs(root.left, true);
        }
    }
}
